#include <my_header.h>

//这个.c文件用来实现server端口的续传问题：

i//用来进行server端的断续判断函数，需要夹在recvFile函数中
int judgeFileAgain(char *filename,int fileSize){

    //通过文件名称打开文件：没有就创建一个新文件
    int fd=open(filename,O_RDWR|O_CREAT,0666);
    ERROR_CHECK(fd,-1,"open");

    //获取当前文件的大小：
    struct stat statBuf;
    fstat(fd,&statBuf);
    off_t existingSize=statBuf.st_size;
    lseek(fd,0,SEEK_END); 

    //对获取的文件大小进行判断：
    if(existingSize == 0){
        //说明是新建的一个文件，用户第一次传输该文件不需要断续
        //发送给用户不需要断续的信息：
        train.length=0;
        send(netFd,&train.length,train.lenght,MSG_NOSIGNAL);
        return 0;
    }
    else if(existingSize >= fileSize){
        //本来大于等于应该覆盖文件，但为了业务逻辑简单，我们规定大于等于时:给client弹出相应的提示
        //表明你之前成功传输过该文件（老师来吧不会写了）

        return 0;
    }
    else if(existingSize < fileSize){
        //表明之前传输过，但未传输完全，符合断点续传情况，返回给客户需要断点续传的消息
        train.length=existingSize;
        send(netFd,&train.length,train.length,MSG_NOSIGNAL);
        return 0;
    }


}

//这是原本是通用的recvFile函数：改成专属于puts指令下的函数（也就是加入断续判断，其它条件应该不需要判断断续）；
int recvFilePuts(int netfd){
    train_t train;
    char filename[4096] = {0};
    recvn(netfd,&train.length,sizeof(train.length));//收火车头
    recvn(netfd,train.data,train.length);//收车厢
    memcpy(filename,train.data,train.length);
    printf("%s\n",filename);

    int fd = open(filename,O_RDWR|O_CREAT|O_TRUNC,0666);
    ERROR_CHECK(fd,-1,"open");

    off_t filesize = 0;
    recvn(netfd,&train.length,sizeof(train.length));
    recvn(netfd,train.data,train.length);
    memcpy(&filesize,train.data,train.length);

    printf("Filesize = %ld\n",filesize);

    //这就是新加的断续判断函数：
    judgeFileAgain(char *filename,int fileSize);

        if(filesize < 4096){
            printf("Tiny file.\n");
            ftruncate(fd,filesize);
            char *p = (char *)mmap(NULL,filesize,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
            recvn(netfd,p,filesize);
            munmap(p,filesize);
        }
        else{
            printf("Hurge file~\n");
            off_t currsize = 0;
            while(1){
                recvn(netfd,&train.length,sizeof(train.length));//收火车头
                if(train.length == 0){
                    break;
                }
                currsize += train.length;
                printf("%5.2lf%%\r",100.0*currsize/filesize);
                fflush(stdout);

                sleep(1);
                recvn(netfd,train.data,train.length);//收车厢
                write(fd,train.data,train.length);
            }
        }
    printf("100.00%%\n");
    close(fd);
    return 0;
}


